<?php

namespace App\Admin\Controllers;

use App\Models\Category;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\HasResourceActions;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
use Illuminate\Http\Request;

class CategoriesController extends Controller
{
    use HasResourceActions;

    public function index(Content $content) {
        return $content
            ->header('商品类目列表')
            ->body($this->grid());
    }

    public function show($id, Content $content) {
        return $content
            ->header('Detail')
            ->description('description')
            ->body($this->detail($id));
    }

    public function edit($id, Content $content) {
        return $content
            ->header('编辑商品类目')
            ->body($this->form(true)->edit($id));
    }

    public function create(Content $content) {
        return $content
            ->header('创建商品类目')
            ->body($this->form(false));
    }

    protected function grid() {
        // Laravel-Admin 1.5.19 之后的新写法，原写法也仍然可以使用
        $grid = new Grid(new Category);

        $grid->id('ID')->sortable();
        $grid->name('名称');
        $grid->level('层级');
        $grid->is_directory('是否目录')->display(function($value) {
            return $value ? '是' : '否';
        });
        $grid->path('类目路径');
        $grid->actions(function($actions) {
            // 不展示Laravel-Admin默认的查看按钮
            $actions->disableView();
        });
        return $grid;
    }

    protected function detail($id) {
        $show = new Show(Category::findOrFail($id));

        $show->id('Id');
        $show->name('Name');
        $show->parent_id('Parent id');
        $show->is_directory('Is directory');
        $show->level('Level');
        $show->path('Path');
        $show->created_at('Created at');
        $show->updated_at('Updated at');

        return $show;
    }

    protected function form($isEditing = false) {
        // Laravel-Admin 1.5.19 之后的新写法，原写法也仍然可以使用
        $form = new Form(new Category);
        $form->text('name','类目名称')->rules('required');
        // 如果是编辑的情况
        if($isEditing) {
            // 不允许用户修改‘是否目录’ 和父类目字段的值
            // 用 display() 方法来展示值，with() 方法接受一个匿名函数，会把字段值传给匿名函数并吧返回值展示出来
            $form->display('is_directory','是否目录')->with(function($value) {
                return $value ? '是' : '否';
            });
            // 支持用符号 . 来展示关联关系的字段
            $form->display('parent.name','父类目');
        } else {
            // 定义一个名为 ‘是否目录的单选框’
            $form->radio('is_directory','是否目录')
                ->options(['1'=> '是','0' => '否'])
                ->default('0')
                ->rules('required');
            // 定义一个名为父类目的下拉框
            $form->select('parent_id','父类目')->ajax('/admin/api/categories');
        }

        return $form;
    }

    // 定义下拉框搜索接口
    public function apiIndex(Request $request) {
        // 用户输入的值通过 q 参数获取
        $search = $request->input('q');
        $result = Category::query()
                // 通过 is_directory 参数来控制
                ->where('is_directory',boolval($request->input('is_directory',true)))
                ->where('name','like','%'.$search.'%')
                ->paginate();
        // 把查询出来的结果重新组装成Laravel-Admin 需要的格式
        $result->setCollection($result->getCollection()->map(function(Category $category){
            return [
                'id' => $category->id,
                'text' => $category->full_name,
            ];
        }));

        return $result;
    }
}
